package com.ruoyi.event.service.impl;

import java.util.*;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ruoyi.event.domain.EventImageList;
import com.ruoyi.event.mapper.EventImageListMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.event.mapper.EventInfoListMapper;
import com.ruoyi.event.domain.EventInfoList;
import com.ruoyi.event.service.IEventInfoListService;

/**
 * 活动信息Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-09-12
 */
@Service
public class EventInfoListServiceImpl implements IEventInfoListService 
{
    private static final Logger log = LoggerFactory.getLogger(EventInfoListServiceImpl.class);

    @Autowired
    private EventInfoListMapper eventInfoListMapper;

    @Autowired
    private EventImageListMapper eventImageListMapper;

    /**
     * 查询活动信息
     * 
     * @param eventid 活动信息主键
     * @return 活动信息
     */
    @Override
    public EventInfoList selectEventInfoListByEventid(Long eventid)
    {
        return eventInfoListMapper.selectEventInfoListByEventid(eventid);
    }

    /**
     * 查询活动信息列表
     * 
     * @param eventInfoList 活动信息
     * @return 活动信息
     */
    @Override
    public List<EventInfoList> selectEventInfoListList(EventInfoList eventInfoList)
    {
        // 1. 查询活动信息列表
        if(eventInfoList.getProvince() != null && eventInfoList.getProvince().equals("全国") ){
            eventInfoList.setProvince("");
        }
        List<EventInfoList> eventInfoLists = eventInfoListMapper.selectEventInfoListList(eventInfoList);
        if(eventInfoLists.isEmpty()){
            return List.of();
        }

        // 2. 提取所有活动ID，批量查询图片（避免N+1查询问题）
//        List<Long> eventIds = eventInfoLists.stream()
//                .map(EventInfoList::getEventid)
//                .collect(Collectors.toList());

//        LambdaQueryWrapper<EventImageList> imageQuery = new LambdaQueryWrapper<>();
//        imageQuery.in(EventImageList::getEventid, eventIds);
//        List<EventImageList> allImages = eventImageListMapper.selectList(imageQuery);
        // 2. 提取所有活动ID，批量查询图片（避免N+1查询问题）
        Long[] eventIds = eventInfoLists.stream()
                .map(EventInfoList::getEventid)
                .toArray(Long[]::new);
//开始组装各种图片数组
        List<EventImageList> eventImageLists = eventImageListMapper.selectEventImageListListNew(eventIds,"small_image");

        // 3. 图片按活动ID分组，便于快速关联
        Map<Long, List<EventImageList>> imageGroupByEventId = eventImageLists.stream()
                .collect(Collectors.groupingBy(EventImageList::getEventid));

        // 4. 组装结果DTO
        List<EventInfoList> eventInfoListsresult = new ArrayList<>();
        for (EventInfoList event : eventInfoLists) {
            EventInfoList dto = new EventInfoList();
            // 复制活动基本信息（如eventid、标题、时间等）
            BeanUtils.copyProperties(event, dto);

            // 获取当前活动对应的图片列表（无图片则返回空列表）
            List<EventImageList> images = imageGroupByEventId.getOrDefault(event.getEventid(), Collections.emptyList());
            // 将图片列表嵌入活动信息中
            dto.setImageList(images);

            eventInfoListsresult.add(dto);

        }

        eventInfoLists = new ArrayList<>();
        // 遍历原集合，逐个复制元素并添加到新集合
//        for (EventInfoList item : eventInfoListsresult) {
//            EventInfoList newItem = new EventInfoList();
//            BeanUtils.copyProperties(item, newItem); // 复制单个元素的属性
//            eventInfoLists.add(newItem);
//        }
        eventInfoLists.addAll(eventInfoListsresult);
        //log.info("eventInfoLists:{}", eventInfoLists.toString());

        eventImageLists = new ArrayList<>();
        eventImageLists = eventImageListMapper.selectEventImageListListNew(eventIds,"big_image");

        // 图片按活动ID分组，便于快速关联
        imageGroupByEventId=new HashMap<>();
        imageGroupByEventId = eventImageLists.stream()
                .collect(Collectors.groupingBy(EventImageList::getEventid));

        // 4. 组装结果DTO
        eventInfoListsresult =new ArrayList<>();
        for (EventInfoList event : eventInfoLists) {
            EventInfoList dto = new EventInfoList();
            // 复制活动基本信息（如eventid、标题、时间等）
            BeanUtils.copyProperties(event, dto);

            // 获取当前活动对应的图片列表（无图片则返回空列表）
            List<EventImageList> images = imageGroupByEventId.getOrDefault(event.getEventid(), Collections.emptyList());
            // 将图片列表嵌入活动信息中
            dto.setBigImageList(images);

            eventInfoListsresult.add(dto);
        }
        eventInfoLists=new ArrayList<>();
        eventInfoLists.addAll(eventInfoListsresult);
        //二维码图片
        eventImageLists = new ArrayList<>();
        eventImageLists = eventImageListMapper.selectEventImageListListNew(eventIds,"qr_image");

        // 图片按活动ID分组，便于快速关联
        imageGroupByEventId=new HashMap<>();
        imageGroupByEventId = eventImageLists.stream()
                .collect(Collectors.groupingBy(EventImageList::getEventid));

        // 4. 组装结果DTO
        eventInfoListsresult =new ArrayList<>();
        for (EventInfoList event : eventInfoLists) {
            EventInfoList dto = new EventInfoList();
            // 复制活动基本信息（如eventid、标题、时间等）
            BeanUtils.copyProperties(event, dto);

            // 获取当前活动对应的图片列表（无图片则返回空列表）
            List<EventImageList> images = imageGroupByEventId.getOrDefault(event.getEventid(), Collections.emptyList());
            // 将图片列表嵌入活动信息中
            dto.setQrcodeImageList(images);

            eventInfoListsresult.add(dto);
        }
        eventInfoLists=new ArrayList<>();
        eventInfoLists.addAll(eventInfoListsresult);

        return eventInfoLists;
    }

    /**
     * 小程序新增活动信息
     * 
     * @param eventInfoList 活动信息
     * @return 结果
     */
    @Override
    public int insertEventInfoListxcx(EventInfoList eventInfoList)
    {
        int result = 0;
        eventInfoList.setStatus("0");
        result = eventInfoListMapper.insertEventInfoList(eventInfoList);
        log.info("insertEventInfoListxcx result:{}", result);
        if( result != 1 ){
            return result;
        }
        log.info(eventInfoList.toString());


        // 遍历imageList中的每个图片项
        List<EventImageList> eventImageLists = eventInfoList.getImageList();

        for (int i = 0; i < eventImageLists.size(); i++) {
            EventImageList imageItem = eventImageLists.get(i);
            log.info("处理第{}个图片项：{}", i + 1, imageItem);
            // 1. 保存URL到数据库
            imageItem.setEventid(eventInfoList.getEventid());
            result= eventImageListMapper.insertEventImageList(imageItem);
            if( result != 1 ){
                return result;
            }
        }

        // 遍历bigImageList中的每个图片项
        List<EventImageList> eventBigImageLists = eventInfoList.getBigImageList();

        for (int i = 0; i < eventBigImageLists.size(); i++) {
            EventImageList imageItem = eventBigImageLists.get(i);
            log.info("处理第{}个bigImageList图片项：{}", i + 1, imageItem);
            // 1. 保存URL到数据库
            imageItem.setEventid(eventInfoList.getEventid());
            result= eventImageListMapper.insertEventImageList(imageItem);
            if( result != 1 ){
                return result;
            }
        }

        // 遍历qrImageList中的每个图片项
        List<EventImageList> eventQrImageLists = eventInfoList.getQrcodeImageList();

        for (int i = 0; i < eventQrImageLists.size(); i++) {
            EventImageList imageItem = eventQrImageLists.get(i);
            log.info("处理第{}个qrImageList图片项：{}", i + 1, imageItem);
            // 1. 保存URL到数据库
            imageItem.setEventid(eventInfoList.getEventid());
            result= eventImageListMapper.insertEventImageList(imageItem);
            if( result != 1 ){
                return result;
            }
        }

        return result ;
    }

    /**
     * 新增活动信息
     *
     * @param eventInfoList 活动信息
     * @return 结果
     */
    @Override
    public int insertEventInfoList(EventInfoList eventInfoList)
    {
        return eventInfoListMapper.insertEventInfoList(eventInfoList);
    }

    /**
     * 修改活动信息
     * 
     * @param eventInfoList 活动信息
     * @return 结果
     */
    @Override
    public int updateEventInfoList(EventInfoList eventInfoList)
    {
        return eventInfoListMapper.updateEventInfoList(eventInfoList);
    }

    /**
     * 批量删除活动信息
     * 
     * @param eventids 需要删除的活动信息主键
     * @return 结果
     */
    @Override
    public int deleteEventInfoListByEventids(Long[] eventids)
    {
        return eventInfoListMapper.deleteEventInfoListByEventids(eventids);
    }

    /**
     * 删除活动信息信息
     * 
     * @param eventid 活动信息主键
     * @return 结果
     */
    @Override
    public int deleteEventInfoListByEventid(Long eventid)
    {
        return eventInfoListMapper.deleteEventInfoListByEventid(eventid);
    }
}
